<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script>
			/*
			 * then
			 * then 方法就是把原来的回调写法分离出来，在异步操作执行完后，用链式调用的方式执行回调函数。
			 * 而 Promise 的优势就在于这个链式调用。我们可以在 then 方法中继续写 Promise 对象并返回，
			 */
			//做饭
			function cook(){
				console.log("开始做饭");
				var p =new Promise(function(resolve,reject){
					setTimeout(function(){
						console.log("做饭完毕");
						resolve("鸡蛋炒饭");
						//reject('烧焦的米饭');
					},1000);
				});
				return p;
			}
			//吃饭
			function eat(data){
				console.log("开始吃饭:"+data);
				var p=new Promise(function(resolve,reject){
					setTimeout(function(){
						console.log("吃饭完毕");
						resolve("一个碗和一双筷子");
					},2000);
				});
				return p;
			}
			//洗碗
			function wash(data){
				console.log("开始洗碗:"+data);
				var p=new Promise(function(resolve,reject){
					setTimeout(function(){
						console.log('洗碗完毕!');
						 resolve('干净的碗筷');
					},2000);
					
				});
				return p;
			}
			
			
			//切菜
			function cutUp(){
			    console.log('开始切菜。');
			    var p = new Promise(function(resolve, reject){        //做一些异步操作
			        setTimeout(function(){
			            console.log('切菜完毕！');
			            resolve('切好的菜');
			        }, 1000);
			    });
			    return p;
			}
			 
			//烧水
			function boil(){
			    console.log('开始烧水。');
			    var p = new Promise(function(resolve, reject){        //做一些异步操作
			        setTimeout(function(){
			            console.log('烧水完毕！');
			            resolve('烧好的水');
			        }, 1000);
			    });
			    return p;
			}
//使用then进行链式调用
//			cook().then(eat).then(wash).then(function(data){
//				console.log(data);
//			});
			/**
			 * resolve 方法把 Promise 的状态置为完成态,这时 then 方法就能捕捉到变化，并执行“成功”情况的回调。
			 * 而 reject 方法就是把 Promise 的状态置为已失败，这时 then 方法执行“失败”情况的回调（then 方法的第二参数）
			 */
//			cook().then(eat, function(data){
//			  console.log(data + '没法吃!');
//			});
			
//catch()方法
			//它可以和 then 的第二个参数一样，用来指定 reject 的回调
//			cook().then(eat).catch(function(data){
//			    console.log(data + '没法吃!');
//			});
/**
* 它的另一个作用是，当执行 resolve 的回调（也就是上面 then 中的第一个参数）时，
* 如果抛出异常了（代码出错了），那么也不会报错卡死 js，而是会进到这个 catch 方法中。
*/

//			cook().then(function(data){
//				throw new Error('米饭打翻了');
//				eat(data);
//			}).catch(function(data){
//				console.log(data);
//			});

//all方法
			/**
			 * all 方法提供了并行执行异步操作的能力，并且在所有异步操作执行完后才执行回调。
			 */
//			Promise.all([cutUp(),boil()]).then(function(results){
//				console.log("准备工作完毕");
//				console.log(results);
//			})
//race()方法
			/**
			 * 而 race 的话只要有一个异步操作执行完毕，就立刻执行 then 回调。
			 */
//			Promise.race([cutUp(), boil()]).then(function(results){
//			    console.log("准备工作完毕：");
//			    console.log(results);
//			});
		</script>
	</body>
</html>
